package main

import (
	"fmt"
	"strconv"
	"sync"
	"time"
)

func main() {
	testWaitGroup()
	//testOnce()
}

// testWaitGroup
//
//	@Description: Wait 方法等到计数值归零之后才返回
func testWaitGroup() {
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			time.Sleep(10 * time.Millisecond)
			fmt.Println("hello world " + strconv.Itoa(i))
		}(i)
	}
	wg.Wait()
	fmt.Println("wait over")
}

var s string
var once sync.Once

// testOnce
//
//	@Description: 对于 once.Do(f) 调用，f 函数的那个单次调用一定 happens before 任何 once.Do(f) 调用的返回。
//	换句话说，就是函数 f 一定会在 Do 方法返回之前执行。
func testOnce() {
	once.Do(foo)
	print(s)
}

func foo() {
	fmt.Println("in foo")
	s = "hello-world"
}
